﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using Monitor.Filters;
using Monitor.Models.Json;
using ServiceStack.Text;

namespace Monitor.Controllers.ApiControllers.Administrator
{
    public class CarController : MainApiController
    {

        #region получение результатов

        // GET api/car
        public IEnumerable<CarOutput> Get()
        {
            try
            {
                return DataRepository.CarRepository.GetCars().Select(n => new CarOutput(n));

            }
            catch (Exception e)
            {
                ErrorLogger.Error(e.Message);
            }
            return null;
        }
        
        public CarOutput Get(Int64 id)
        {
            try
            {
                var query = DataRepository.CarRepository.GetCarById(id);
                if (query != null)
                {
                    return new CarOutput(query);
                }

            }
            catch (Exception e)
            {
                ErrorLogger.Error(this.ControllerContext, e);
            }
            return null;
        }

        public GetSumCar Get([FromUri] int pagenum, [FromUri] int pagesize)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    var dbResult = DataRepository
                        .CarRepository
                        .GetCars();
                    return new GetSumCar
                    {
                        TotalRows = dbResult.Count(),
                        Rows = dbResult.Skip(pagenum * pagesize)
                            .Take(pagesize)
                            .ToList()
                            .Select(n => new CarOutput(n))
                    };
                }
                return null;
            }
            catch (Exception e)
            {
                ErrorLogger.Error(this.ControllerContext, e);
                return null;
            }

        }

        #endregion

        #region Добавить/изменить

        // PUT data/bak/5
        public HttpResponseMessage Put(CarInput model)
        {
            if (model.IsValid)
            {
                try
                {
                    if (!model.Id.HasValue)
                    {
                        DataRepository.CarRepository.AddCar(model);
                    }
                    else
                    {
                        DataRepository.CarRepository.EditCar(model);
                    }
                }
                catch (EvaluateException e)
                {
                    return Request.CreateResponse(HttpStatusCode.Conflict, e.Message);
                }
                catch (Exception e)
                {
                    ErrorLogger.Fatal(this.ControllerContext, e);
                    return Request.CreateResponse(HttpStatusCode.Conflict,
                                                  "Извините, пожалуйста, но произошла ошибка при на сервере. Администратор уже оповещен.","utf-8");
                }
                return Request.CreateResponse(HttpStatusCode.OK);
            }
            else
            {
                return Request.CreateResponse(HttpStatusCode.Forbidden, "Ошибка в данных");
            }

        }

        #endregion

        #region удаление

        // DELETE api/car/5
        public HttpResponseMessage Delete(Int64 id)
        {
            try
            {
                DataRepository.CarRepository.DeleteCar(id);
                return Request.CreateResponse(HttpStatusCode.OK);
            }
            catch (Exception e)
            {
                ErrorLogger.Fatal(this.ControllerContext, e);
                return Request.CreateResponse(HttpStatusCode.Conflict,
                                              "Извините, пожалуйста, но произошла ошибка при на сервере. Администратор уже оповещен.");
            }

        }

        #endregion

    }
}
